# 1. 先定义类
class Teacher:
    name = "我是类属性：白念栓3.0" # 类属性，归属于类
    # __init__初始化方法：一出生就带有的
    # 老师对象，都有哪些？
    def __init__(self,name,age,sex):
        # self，表示对象本身的属性
        self.name = name
        self.age = age
        self.sex = sex
    # 类方法
    # self，表示的就是对象本身。这个方法可以被对象调用
    def eat(self,food):
        # print(f"{name}正在吃{food}") # NameError: name 'name' is not defined
        # 在类里面，只有前面带了self,才能找到这个实例属性
        print(self) # 对象的地址值：0x00000205AD633FD0
        print(f"{self.name}正在吃{food}")
        # return f"{self.name}正在吃{food}"

    def course(self):
        print('course')
        return 222



# 基于Teacher类，创建对象
if __name__ == '__main__': # 程序运行入口，基于当前的py文件
    t1 = Teacher(name="侯雯中",age="19",sex="女") # name，age，sex。你想创建一个对象，就必须按照初始化的方法传参
    # print(t1.name) # 侯雯中
    # t1.eat("汉堡")
    t2 = Teacher("金巴", age=23, sex="中性")
    # print(Teacher.name) # 类属性，类属性必须先定义，后使用
    # print(Teacher.__dict__) # 打印类全部的属性

    # Teacher.eat("汉堡包") # 会报错，因为没有通过对象去调用它
    # print(Teacher(name="侯雯中",age="19",sex="女").eat("汉堡包")) # 类里的方法，必须通过对象才能调用

    # 直接通过Teacher调用类方法
    # aa = Teacher.course(222) # 这是一个警告，它把222当成了对象传递
    # print(aa)

    # 直接通过Teacher调用eat方法
    # Teacher.eat(t1,"鸡蛋") # 当Teacher类后面没加括号，调用方法的时候，就需要手动传入对象

    # 修改类属性值
    """print(Teacher.name)
    Teacher.name = "白念栓2.0"
    print(Teacher.name)
"""
    # 添加类属性
    """Teacher.play = "侯雯中"
    print(Teacher.play)"""
    # 删除类属性
    # del Teacher.play
    # print(Teacher.play) # AttributeError: type object 'Teacher' has no attribute 'play'
    # 对象独有的属性
    print(t1.__dict__)
    # 对象调用方法
    # t1.course()
    print(t1.course())

    # 修改对象属性
    t1.name = "赵俊博"
    # print(t1.name)
    t1.eat("汉堡包")

    # 删除对象属性
    del t1.age
    # print(t1.age) # AttributeError: 'Teacher' object has no attribute 'age'

    # 对象完全独立，一个对象的操作不会影响到另外一个对象
    print(t2.age)
